package com.kx.controller;

import com.kx.bean.Car;
import com.kx.bean.User;
import com.kx.service.*;
import com.kx.vo.BarVO;
import com.kx.vo.CarBarVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class CarController {

    @Autowired
    private CarService carService;

    @Autowired
    private ParkingSpaceService parkingSpaceService;

    @Autowired
    private UserService userService;

    @Autowired
    private TollService tollService;

//    @Autowired
//    private BlacklistService blacklistService;

    /**
     * 查询所有的车辆信息并进行分页
     *
     * @param page
     * @param limit
     * @return
     */
    @RequestMapping(value = "/findAllCar", method = RequestMethod.GET)
    @ResponseBody
    public Object findUserData(@RequestParam("page") Integer page, @RequestParam("limit") Integer limit) {
        return carService.findData(page, limit);
    }

    /**
     * 获取近七天入库的车辆数并以柱状图方式显示
     *
     * @return
     */
    @RequestMapping("/getBarVO")
    @ResponseBody
    public BarVO getBarVO() {
        return carService.getBarVO();
    }

    /**
     * 获取近七天入库的车辆数并以饼状图方式显示
     *
     * @return
     */
    @RequestMapping("/getPieVO")
    @ResponseBody
    public List<CarBarVO> getPieVO() {
        return carService.getPieVO();
    }

    /**
     * 车辆入场
     * 1、有空余车位 进入,改变入出库状态in_out_state，记录车辆进入时间create_time
     * 根据车牌号查询数据库中是否有此车辆
     * 若存在车牌：进入  改变入出库状态为1（入库），改变remark状态为预订的车位号
     * 若不存在车牌：自动创建车牌记录，改变入出库状态为1（入库）
     * 2、无空余车位 查看是否有预约
     * 根据车牌号license_plate查到车牌编号cid，再根据车牌编号查找是否有相对应的用户记录
     * 若车牌无车主：不让进，提示车位已满
     * 若车牌有车主：根据用户编号uid查看用户是否预约车位
     * 车主有预约：进入，改变入出库状态为1（入库）
     * 车主无预约：不让进，提示车位已满
     *
     * @param car
     * @return
     */
    @RequestMapping("updateCarEnterByLicensePlate")
    @ResponseBody
    public int updateCarEnterByLicensePlate(Car car) throws Exception{
        int i = 0;
        if (car != null && parkingSpaceService.findReleaseSpace() > 0) {
            Car car1 = carService.findCarByLicensePlate(car.getLicensePlate());
            User user = null;
            try {
                user = userService.findByCid(car1.getCid());
                if (user == null){
                    i = carService.saveEnter(car);
                }else {
                    i = carService.updateByLicensePlateEnter(car1);
                }
            } catch (NullPointerException e) {
                if (user == null){
                    i = carService.saveEnter(car);
                }else {
                    i = carService.updateByLicensePlateEnter(car1);
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        } else if (car != null && parkingSpaceService.findReleaseSpace() == 0) {
            Car car1 = carService.findCarByLicensePlate(car.getLicensePlate());
            User user = userService.findByCid(car1.getCid());
            if (user.getPid() == null) {
                return i;
            } else {
                i = carService.updateByLicensePlateEnter(car1);
            }
        }
        return i;
    }

    /**
     * 车辆出场
     * 在数据库中根据车牌号查看是否有对应车牌编号cid（根据车牌号查看是否在数据库中（因为有时难免不保证车辆正常方式进入））
     * 1、若存在车牌  再根据车牌编号查找是否有相对应的用户记录
     * 若车辆无对应车主：生成对应订单，扫描二维码付款
     * 支付成功后：出库，改变入出库状态0（出库）
     * 未支付成功：提示支付失败
     * 若车辆有对应车主：生成对应订单，根据对应的订单总计费用total_cost，用户钱包判断金额是否大于此费用
     * 若大于：自动扣款 出库，改变入出库状态0（出库）
     * 若小于：提示余额不足，请选择充值或扫描二维码付款
     * <1>、充值：重新车牌扫描
     * <2>、扫描二维码付款
     * 支付成功后：出库，改变入出库状态0（出库），订单
     * 未支付成功：提示支付失败
     * 2、若不存在此车牌  提示走人工通道
     *
     * @return
     */
    @RequestMapping("updateCarOutByLicensePlate")
    @ResponseBody
    public int updateCarOutByLicensePlate(Car car) {
        int i = 0;
        int price = 0;
        if (car != null && car.getLicensePlate().length() == 7) {
            Car car1 = carService.findCarByLicensePlate(car.getLicensePlate());
            if (car1 == null) {     //车牌识别时数据库中没有找到车牌号
                return i;
            } else {    //车牌识别时数据库中有车牌号
                try {
                    userService.findByCid(car1.getCid());   //判断是否有用户绑定过此车牌，是则下一步，否则进入catch
                    price = carService.updateByLicensePlateOut(car1);
                } catch (Exception e) {
                    price = carService.updateOnlyByLicensePlateOut(car1);
                }
            }
        }
        return price;
    }

    @RequestMapping("/updateCar")
    @ResponseBody
    public int updateCar(Car car) {
        int i = 0;
        if (car.getLicensePlate() != null && car.getInOutStatus() != null && car.getPackingFee() != null && car.getPaymentStatus() != null) {
            i = carService.updateCar(car);
        } else {
            return i;
        }
        return i;
    }

    @RequestMapping("deleteCar")
    @ResponseBody
    public Object deleteCar(Integer cid) {
        return carService.deleteCar(cid);
    }

    @RequestMapping("insertCar")
    @ResponseBody
    public int insertCar(Car car) {
        return carService.save(car);
    }
}